package org.convallaria.framework.common.constants.sys;

/**
 * 系统登录日志相关常量
 * 
 * 功能特性：
 * - 定义登录状态常量
 * - 定义登录日志字段长度限制
 * - 提供统一的常量管理
 * 
 * 设计原则：
 * - 所有常量都是public static final
 * - 使用final类防止继承
 * - 私有构造函数防止实例化
 * - 按功能模块分组组织
 * 
 * @author convallaria
 * @since 1.0.0
 */
public final class LoginLogConstants {

    private LoginLogConstants() {
        // 防止实例化
    }

    // ==================== 登录状态常量 ====================

    /**
     * 登录成功
     */
    public static final String LOGIN_STATUS_SUCCESS = "0";

    /**
     * 登录失败
     */
    public static final String LOGIN_STATUS_FAIL = "1";

    // ==================== 登录日志字段长度限制 ====================

    /**
     * 用户名最大长度
     */
    public static final int USER_NAME_MAX_LENGTH = 50;

    /**
     * IP地址最大长度
     */
    public static final int IPADDR_MAX_LENGTH = 128;

    /**
     * 登录地点最大长度
     */
    public static final int LOGIN_LOCATION_MAX_LENGTH = 255;

    /**
     * 浏览器类型最大长度
     */
    public static final int BROWSER_MAX_LENGTH = 50;

    /**
     * 操作系统最大长度
     */
    public static final int OS_MAX_LENGTH = 50;

    /**
     * 提示消息最大长度
     */
    public static final int MSG_MAX_LENGTH = 255;

    /**
     * 备注最大长度
     */
    public static final int REMARK_MAX_LENGTH = 500;

    // ==================== 登录状态描述 ====================

    /**
     * 登录状态描述映射
     */
    public static final String[] LOGIN_STATUS_DESCRIPTIONS = {
        "成功", "失败"
    };

    // ==================== 默认值常量 ====================

    /**
     * 默认登录状态
     */
    public static final String DEFAULT_LOGIN_STATUS = LOGIN_STATUS_SUCCESS;

    // ==================== 业务规则常量 ====================

    /**
     * IP地址正则表达式（IPv4和IPv6）
     */
    public static final String IPADDR_PATTERN = "^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$|^(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$";

    /**
     * 浏览器类型正则表达式（字母、数字、下划线、连字符、空格、斜杠）
     */
    public static final String BROWSER_PATTERN = "^[a-zA-Z0-9_\\-\\s/]+$";

    /**
     * 操作系统正则表达式（字母、数字、下划线、连字符、空格、点号、括号）
     */
    public static final String OS_PATTERN = "^[a-zA-Z0-9_\\-\\s.()]+$";

    // ==================== 常用浏览器类型常量 ====================

    /**
     * Chrome浏览器
     */
    public static final String BROWSER_CHROME = "Chrome";

    /**
     * Firefox浏览器
     */
    public static final String BROWSER_FIREFOX = "Firefox";

    /**
     * Safari浏览器
     */
    public static final String BROWSER_SAFARI = "Safari";

    /**
     * Edge浏览器
     */
    public static final String BROWSER_EDGE = "Edge";

    /**
     * Internet Explorer浏览器
     */
    public static final String BROWSER_IE = "Internet Explorer";

    /**
     * Opera浏览器
     */
    public static final String BROWSER_OPERA = "Opera";

    // ==================== 常用操作系统常量 ====================

    /**
     * Windows操作系统
     */
    public static final String OS_WINDOWS = "Windows";

    /**
     * macOS操作系统
     */
    public static final String OS_MACOS = "macOS";

    /**
     * Linux操作系统
     */
    public static final String OS_LINUX = "Linux";

    /**
     * Android操作系统
     */
    public static final String OS_ANDROID = "Android";

    /**
     * iOS操作系统
     */
    public static final String OS_IOS = "iOS";

    // ==================== 常用登录消息常量 ====================

    /**
     * 登录成功消息
     */
    public static final String MSG_LOGIN_SUCCESS = "登录成功";

    /**
     * 登录失败消息
     */
    public static final String MSG_LOGIN_FAIL = "登录失败";

    /**
     * 用户名或密码错误
     */
    public static final String MSG_USERNAME_PASSWORD_ERROR = "用户名或密码错误";

    /**
     * 账户已被锁定
     */
    public static final String MSG_ACCOUNT_LOCKED = "账户已被锁定";

    /**
     * 账户已被停用
     */
    public static final String MSG_ACCOUNT_DISABLED = "账户已被停用";

    /**
     * 验证码错误
     */
    public static final String MSG_CAPTCHA_ERROR = "验证码错误";

    /**
     * 账户已过期
     */
    public static final String MSG_ACCOUNT_EXPIRED = "账户已过期";

    // ==================== 工具方法 ====================

    /**
     * 获取登录状态描述
     * 
     * @param status 状态值
     * @return 状态描述
     */
    public static String getLoginStatusDesc(String status) {
        if (LOGIN_STATUS_SUCCESS.equals(status)) {
            return LOGIN_STATUS_DESCRIPTIONS[0];
        } else if (LOGIN_STATUS_FAIL.equals(status)) {
            return LOGIN_STATUS_DESCRIPTIONS[1];
        }
        return "未知";
    }

    /**
     * 验证登录状态是否有效
     * 
     * @param status 状态值
     * @return true=有效，false=无效
     */
    public static boolean isValidLoginStatus(String status) {
        return LOGIN_STATUS_SUCCESS.equals(status) || LOGIN_STATUS_FAIL.equals(status);
    }

    /**
     * 验证用户名是否有效
     * 
     * @param userName 用户名
     * @return true=有效，false=无效
     */
    public static boolean isValidUserName(String userName) {
        if (userName == null || userName.trim().isEmpty()) {
            return true; // 用户名可以为空
        }
        return userName.length() <= USER_NAME_MAX_LENGTH;
    }

    /**
     * 验证IP地址是否有效
     * 
     * @param ipaddr IP地址
     * @return true=有效，false=无效
     */
    public static boolean isValidIpaddr(String ipaddr) {
        if (ipaddr == null || ipaddr.trim().isEmpty()) {
            return true; // IP地址可以为空
        }
        if (ipaddr.length() > IPADDR_MAX_LENGTH) {
            return false;
        }
        return ipaddr.matches(IPADDR_PATTERN);
    }

    /**
     * 验证登录地点是否有效
     * 
     * @param loginLocation 登录地点
     * @return true=有效，false=无效
     */
    public static boolean isValidLoginLocation(String loginLocation) {
        if (loginLocation == null || loginLocation.trim().isEmpty()) {
            return true; // 登录地点可以为空
        }
        return loginLocation.length() <= LOGIN_LOCATION_MAX_LENGTH;
    }

    /**
     * 验证浏览器类型是否有效
     * 
     * @param browser 浏览器类型
     * @return true=有效，false=无效
     */
    public static boolean isValidBrowser(String browser) {
        if (browser == null || browser.trim().isEmpty()) {
            return true; // 浏览器类型可以为空
        }
        if (browser.length() > BROWSER_MAX_LENGTH) {
            return false;
        }
        return browser.matches(BROWSER_PATTERN);
    }

    /**
     * 验证操作系统是否有效
     * 
     * @param os 操作系统
     * @return true=有效，false=无效
     */
    public static boolean isValidOs(String os) {
        if (os == null || os.trim().isEmpty()) {
            return true; // 操作系统可以为空
        }
        if (os.length() > OS_MAX_LENGTH) {
            return false;
        }
        return os.matches(OS_PATTERN);
    }

    /**
     * 验证提示消息是否有效
     * 
     * @param msg 提示消息
     * @return true=有效，false=无效
     */
    public static boolean isValidMsg(String msg) {
        if (msg == null || msg.trim().isEmpty()) {
            return true; // 提示消息可以为空
        }
        return msg.length() <= MSG_MAX_LENGTH;
    }

    /**
     * 判断是否为登录成功
     * 
     * @param status 登录状态
     * @return true=成功，false=失败
     */
    public static boolean isLoginSuccess(String status) {
        return LOGIN_STATUS_SUCCESS.equals(status);
    }

    /**
     * 判断是否为登录失败
     * 
     * @param status 登录状态
     * @return true=失败，false=成功
     */
    public static boolean isLoginFail(String status) {
        return LOGIN_STATUS_FAIL.equals(status);
    }

    /**
     * 清理用户名（去除多余空格）
     * 
     * @param userName 原始用户名
     * @return 清理后的用户名
     */
    public static String cleanUserName(String userName) {
        if (userName == null) {
            return "";
        }
        return userName.trim().replaceAll("\\s+", " ");
    }

    /**
     * 清理IP地址（去除多余空格）
     * 
     * @param ipaddr 原始IP地址
     * @return 清理后的IP地址
     */
    public static String cleanIpaddr(String ipaddr) {
        if (ipaddr == null) {
            return "";
        }
        return ipaddr.trim();
    }

    /**
     * 清理浏览器类型（去除多余空格）
     * 
     * @param browser 原始浏览器类型
     * @return 清理后的浏览器类型
     */
    public static String cleanBrowser(String browser) {
        if (browser == null) {
            return "";
        }
        return browser.trim().replaceAll("\\s+", " ");
    }

    /**
     * 清理操作系统（去除多余空格）
     * 
     * @param os 原始操作系统
     * @return 清理后的操作系统
     */
    public static String cleanOs(String os) {
        if (os == null) {
            return "";
        }
        return os.trim().replaceAll("\\s+", " ");
    }
}
